#pragma once

#include <string>
#include <vector>

//#include <common/HYPlugin.hpp>

/// @addtogroup HYPlugin
    /// @{

    /// @brief 机器人IO类型
enum RobotIOType
{
    ROBOT_IO_TYPE_DI,  /// DI，数字输入
    ROBOT_IO_TYPE_DO,  /// DO，数字输出
    ROBOT_IO_TYPE_AI,  /// AI，模拟输入
    ROBOT_IO_TYPE_AO,  /// AO，模拟输出
    ROBOT_IO_TYPE_VAL  /// 变量
};

/// @brief 机器人IO动作类型
enum RobotIOAction
{
    ROBOT_IO_ACTION_GET,  /// 读取IO或变量等于
    ROBOT_IO_ACTION_SET,  /// 设置IO或者变量
    ROBOT_IO_ACTION_WAIT_EQ, /// 读取IO或变量，直到等于
    ROBOT_IO_ACTION_WAIT_GT, /// 读取IO或变量，直到大于
    ROBOT_IO_ACTION_WAIT_LT, /// 读取IO或变量，直到小于
    ROBOT_IO_ACTION_WAIT_MS /// 等待延时，单位毫秒
};

/// @brief 机器人IO任务
struct HYRobotIOTask
{
    RobotIOAction Action; /// IO任务动作
    RobotIOType Type; /// IO任务类型
    std::string Name; /// IO名称
    double Value; /// IO值
};

/// @brief 机器人姿态类型
enum RobotPoseType
{
    ROBOT_POSE_CARTESIAN,  /// 笛卡尔姿态
    ROBOT_POSE_JOINT  /// 关节姿态
};

/// @brief 机器人姿态
struct RobotPose
{
    /// @brief 姿态类型
    RobotPoseType Type;
    /// @brief 姿态值
    std::vector<double> Value;
};

/// @brief 机器人工作流任务类型
enum RobotWorkFlowTaskType
{
    /// IO任务
    ROBOT_WORKFLOW_IO_TASK,
    /// 预设姿态
    ROBOT_WORKFLOW_PRESET_POSE,
    /// 运行姿态
    ROBOT_WORKFLOW_RUNTIME_POSE
};

/// @brief 机器人工作流任务
struct RobotWorkFlowTask
{
    /// @brief 工作流任务类型
    RobotWorkFlowTaskType Type;
    /// @brief 工作流任务名称
    std::string Name;
    /// @brief 运行姿态任务包含的姿态个数
    int Size = 1;
};



/// <summary>
/// 机械坐标轴（XYZUVW）限制操作符
/// </summary>
enum AxisLimitOperate
{
    DEFAULT,	/// 不进行修改
    SET_VAULE,	/// 设置值，覆盖原值
    OFFSET		/// 补偿值，在原值上添加补偿值
};
/// <summary>
/// 关节(J0~J5)限制操作符
/// 目前只支持Aubo
/// </summary>
enum JointLimitOperate
{
    JOINT_DEFAULT,	/// 不进行修改
    JOINT_SET_VAULE,	/// 设置值，覆盖原值
    JOINT_OFFSET		/// 补偿值，在原值上添加补偿值
};

/// <summary>
/// 机械坐标轴限制
/// </summary>
struct HYAxisLimitSet
{
    std::string Name;
    AxisLimitOperate Operate;
    double Value;
};

/// <summary>
/// 关节坐标轴限制
/// </summary>
struct HYJointLimitSet
{
    int Name;
    JointLimitOperate Operate;
    double Value;
};

/// <summary>
/// 机器人坐标配置
/// </summary>
struct HYRobotCoordinate
{
    //cv::Mat EyeToHand, EyeInHand;  /// 手眼标定矩阵
    std::vector<double> Tool; /// 工具标定参数
    std::vector<std::vector<double>> Positions; /// 机器人位姿定义
    float RandomRadius;
    std::vector<HYAxisLimitSet> AxisLimit;	//机械坐标轴限制
    std::vector<HYJointLimitSet> JointLimit;//关节坐标轴限制
};
/// @}
